/***************************************************************************
 *   Copyright (C) 2009 by Zheng Yonglei
 *   zhengyonglei@gmail.com   *
 *                                                                         *
 *   This program is free software; you can redistribute it and/or modify  *
 *   it under the terms of the GNU General Public License as published by  *
 *   the Free Software Foundation; either version 2 of the License, or     *
 *   (at your option) any later version.                                   *
 *                                                                         *
 *   This program is distributed in the hope that it will be useful,       *
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
 *   GNU General Public License for more details.                          *
 *                                                                         *
 *   You should have received a copy of the GNU General Public License     *
 *   along with this program; if not, write to the                         *
 *   Free Software Foundation, Inc.,                                       *
 *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
 ***************************************************************************/


#ifndef TESTWORD_H_
#define TESTWORD_H_

#include <QDate>

#include <map>
using namespace std;

#include "Word.h"
#include "TestRecord.h"
#include "types.h"
#include "Options.h"

#define TEST_RECORD_SEPARATOR "|"
#define TEST_PASS_MIN 2

class TestWord : public Word
{
public:
	//for testing
	bool isActive;//only active word will be chosen to recite
	TestState state;
	bool isFrozen;
	int successivePassCount;
	int coolingTimeRemain;

	//for training
	int totalTestCount;
	int lastTestInterval;
	int testHistoryScore;
	int complexity;
	float googleSearchCount;

	//for convenience
	bool passLastTest;

public:
	TestWord();
	TestWord(int id);
	virtual ~TestWord();

	void testFailed();
	void testPassed();
	void setFrozenRemainCycle(int factor);

	void setTestRecords(QString testRecordString);
	QString getTestRecordString();

	map<QDate, TestRecord>& getTestRecordMap(){return mTestRecords;}

	int getTestFinishThreshould(){return mTestFinishThreshould;}

	//for training
	int calculateTotalTestCount();
	int calculateLastTestInterval();
	int calculateTestHistoryScore();
	int calculateComplexity();
	void updateTrainingData();

private:
	map<QDate, TestRecord> mTestRecords;
	map<int, int> mTestScoreMap; //mTestScore<interval, score>
	int mTestFinishThreshould; //The minimum times the user has to pass the test for this word to set the state of this word to 'finished'

private:
	void updateTestProgress();
};

#endif /* TESTWORD_H_ */
